package com.tiny.tinyweb.core.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.dbunit.dataset.datatype.IDataTypeFactory;
import org.dbunit.ext.mysql.MySqlDataTypeFactory;
import org.dbunit.util.fileloader.DataFileLoader;
import org.dbunit.util.fileloader.FlatXmlDataFileLoader;

/**
 * 用来配置测试数据库的注解类，包括忽略数据库命名的大小写标记、数据文件加载器和数据类型工厂。 该注解仅用于基于dbunit的测试类。
 *
 * @see {@link com.tiny.tinyweb.core.test.UnitTestDaoExecutionListener}
 * @author wxiaobin
 */
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface DaoTestConfiguration {
    /**
     * 忽略数据库命名的大小写标记，默认值为<code>true</code>:忽略大小写。
     *
     * @return 数据文件加载器
     */
    public boolean ignoreCase() default true;

    /**
     * 数据文件加载器，默认值为{@link FlatXmlDataFileLoader}:XML文件加载器。
     *
     * @return 数据文件加载器
     */
    public Class<? extends DataFileLoader> dataFileLoader() default FlatXmlDataFileLoader.class;

    /**
     * 数据类型工厂，默认值为{@link MySqlDataTypeFactory}:MySql数据类型工厂。
     *
     * @return 数据类型工厂
     */
    public Class<? extends IDataTypeFactory> dataTypeFactory() default MySqlDataTypeFactory.class;

    /**
     * 数据源名称。
     * @return 数据源名称
     */
    public String dataSource() default "dataSource";

    /**
     * 过测试用DB用户拥有DBA权限，那么必须指定Schema，否则会抛出
     * {@link org.dbunit.database.AmbiguousTableNameException}异常。
     * @return 测试用DB用户的Schema
     */
    public String schema() default "";
}
